/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.ufrn.dca.scontrol.control;

import br.ufrn.dca.controle.QuanserClient;
import br.ufrn.dca.controle.QuanserClientException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Diogo Cacho
 */
public class ListenerTanqueControle implements ActionListener {

    QuanserClient qClient;
    Controladores controlador;
    int controladorID;
    double setPoint;
    double valorColuna01;
    double valorColuna02;
    double valorCorrenteT1;
    double valorCorrenteT2;
    double valorOffsetT1;
    double valorOffsetT2;
    double configuracao;   

    double erro;
    double acao;

    double Tt;
    double Td;
    boolean filtroDerivativo;
    boolean antiWindup;
    boolean running;

    double tempoSubida;
    double tempoDePico;

    double tempoInicial;

    public void setConfiguracao(int c){
        configuracao = c;
    }

    public double getTd() {
        return Td;
    }

    public void setTd(double Td) {
        this.Td = Td;
        controlador.setTd(this.Td);
    }

    public double getTt() {
        return Tt;
    }

    public void setTt(double Tt) {
        this.Tt = Tt;
        controlador.setTt(this.Tt);
    }

    public boolean isAntiWindup() {
        return antiWindup;
    }

    public void setAntiWindup(boolean antiWindup) {
        this.antiWindup = antiWindup;
    }

    public boolean isFiltroDerivativo() {
        return filtroDerivativo;
    }

    public void setFiltroDerivativo(boolean filtroDerivativo) {
        this.filtroDerivativo = filtroDerivativo;
    }

    public Controladores getControlador() {
        return controlador;
    }

    public void setControlador(Controladores controlador) {
        this.controlador = controlador;
    }

    public double getErro() {
        return erro;
    }

    public void setErro(double erro) {
        this.erro = erro;
    }

    public void setValorCorrenteT1(double valorCorrenteT1) {
        this.valorCorrenteT1 = valorCorrenteT1;
    }

    public void setValorCorrenteT2(double valorCorrenteT2) {
        this.valorCorrenteT2 = valorCorrenteT2;
    }

    public double getAcao() {
        return acao;
    }

    public void setValorColuna01(double valorColuna01) {
        this.valorColuna01 = valorColuna01;
    }

    public void setValorColuna02(double valorColuna02) {
        this.valorColuna02 = valorColuna02;
    }
    
    public void setSetPoint(double SP){
        this.setPoint = SP;
    }

    public int getControladorID() {
        return controladorID;
    }

    public double getSetPoint() {
        return setPoint;
    }

    public void setRunning(boolean b){
        this.running = b;
    }

    public void setControladorID(int c){
        this.controladorID = c;
    }

    public double getValorCorrenteT1() {
        return valorCorrenteT1;
    }

    public double getValorCorrenteT2() {
        return valorCorrenteT2;
    }

    public double getValorColuna01() {
        return valorColuna01;
    }

    public double getValorColuna02() {
        return valorColuna02;
    }

    public void carregarParametros(double SP, double Kp, double Ki, double Kd, boolean antiwindup, boolean derivative){
        setPoint = SP;
        controlador.setKp(Kp);
        controlador.setKi(Ki);
        controlador.setKd(Kd);
        controlador.setAntiWindup(antiwindup);
        controlador.setFiltroDerivativo(derivative);
    }

    public ListenerTanqueControle(){
        try{
            qClient = new QuanserClient("10.13.99.69",20081);
            //qClient = new QuanserClient("127.0.0.1",20081);
            controlador = new Controladores();
            valorOffsetT1 = 0;
            valorOffsetT2 = 0;
            controladorID = 1;
            erro = 0;
            acao = 0;
            configuracao = 1;
        }catch(QuanserClientException ex){
            ex.printStackTrace();
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        try{

            valorCorrenteT1 = (double)qClient.read(0);
            valorCorrenteT2 = (double)qClient.read(1);
          

            valorColuna01 = (valorCorrenteT1 + valorOffsetT1) * 6.25;
            valorColuna02 = (valorCorrenteT2 + valorOffsetT2) * 6.25;

            if(configuracao == 1){
                erro = setPoint - valorColuna01;
            }
            else{
                erro = setPoint - valorColuna02;
            }

            switch(controladorID){
                case 1: // controlador P
                    acao = controlador.controladorP(erro);
                break;

                case 2: // controlador PI
                    acao = controlador.controladorPI(erro);
                break;

                case 3: // controlador PD
                    acao = controlador.controladorPD(erro);
                break;

                case 4: // controlador PID
                    acao = controlador.controladorPID(erro);
                break;

                case 5: // controlador PI-D
                    acao = controlador.controladorPI_D(erro,getValorColuna01());
                break;

                default:
                break;
            }


            System.currentTimeMillis();

           /*
            *Escrever Acao no Servidor e verificar travas
            */


            //Trava de tensão limite
            if(acao <= -3)
                acao = -3;
            if(acao >= 3)
                acao = 3;

            //Trava de coluna d'agua
            if(valorColuna01 >= 27)
                acao = 1.75;
            if(valorColuna01 >= 28.5)
                acao = 0;
            if(valorColuna01 <= 3 && acao < 0)
                acao = 0;

            if(running)
                qClient.write(0,acao);
            else
                qClient.write(0,(double)0);

        }
        catch (QuanserClientException ex) {
            Logger.getLogger(ListenerTanque.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void killClient(){
        try{
            qClient.write(0, (double)0.00);
        }catch(QuanserClientException e){
            System.out.println("Problemas em matar o cliente Quanser");
        }
    }


    public void takeOffsetValues(){
        try{
            //QuanserClient q = new QuanserClient("10.13.99.69",20081);
            QuanserClient q = new QuanserClient("127.0.0.1",20081);
            valorOffsetT1 = Math.abs((double) qClient.read(0));
            valorOffsetT2 = Math.abs((double) qClient.read(1));
            q.disconnect();
        }catch(QuanserClientException ex){
            System.out.println("Problema de conexão");
        }
    }

}
